#ifndef ARPSD_CALCULATOR_H
#define ARPSD_CALCULATOR_H

#include <QObject>
#include <QVector>
#include <Eigen/Dense>

class ARPSDCalculator : public QObject
{
    Q_OBJECT

public:
    explicit ARPSDCalculator(QObject *parent = nullptr);

    // 计算 AR 模型 PSD
    QPair<QVector<double>, QVector<double>> calculate(const Eigen::VectorXd& t, const Eigen::VectorXd& y, double fs, int nfft, int AR_order);
    // 插值函数
    Eigen::VectorXd interpolate(const Eigen::VectorXd& t, const Eigen::VectorXd& y, double fs);
    QVector<double> eigenToQVector(const Eigen::VectorXd &eigenVec);
    QVector<double> interp1(const QVector<double> &t, const QVector<double> &y, const QVector<double> &t2, const QString &method);
private:

    // 计算均值
    double mean(const Eigen::VectorXd& vec);

    // 应用汉明窗
    void applyHammingWindow(Eigen::VectorXd& vec);

    // 计算 AR 模型参数（Burg 方法）
    void arburg(const Eigen::VectorXd& y, int AR_order, Eigen::VectorXd& A, double& variance);

    // 计算频率响应
    void freqz(const Eigen::VectorXd& b, const Eigen::VectorXd& a, int nfft, double fs, Eigen::VectorXd& H, Eigen::VectorXd& F);

};

#endif // ARPSD_CALCULATOR_H
